/*
 * @Description:
 * @Author: dh
 * @Date: 2021-09-24 16:40:50
 * @LastEditors: dh
 * @LastEditTime: 2024-05-14 17:46:10
 */

var n: number = 10
var ne!: never
// never类型可以复制给其他类型，反之则不行 ，但never可以赋值never
n = ne // 赋值给其他类型前需要先赋值，这是使用了 确定赋值断言 !.
ne = n // 不行

// 返回never的函数必须存在无法达到的终点, 抛错误|死循环
function Loop(): never {
	while (true) {} // 死循环
}
function Err(): never {
	throw new Error('error')
}

// 任意类型与 never 交叉都得到 never
type T1 = number & never // never
// 任意类型与 never 类型联合，返回原有的类型：
type T4 = string | never // string

// never 和 void 之间的区别
// never 类型为底部类型，也称为零类型或空类型。它通常表示为⊥，表示计算未将结果返回给调用方。
// void 类型，在另一方面，是一个单元类型（类型，它允许只有一个值），没有定义的操作。
type Concat = 'h'['concat']

// 案例
type All = string | number | boolean

function type(val: All) {
	if (typeof val === 'string') {
		return val
	} else if (typeof val === 'number') {
		return val
	} else {
		// FIXME 这里推断 val 为boolean ，所以err 抛错，需要加一个 else if
		const err: never = val
		return err
	}
}
